package codec.fibonacci;

import java.io.*;

/**
 *
 * @author Douglas & Pedro
 * 
 * Trabalha com Files para codificar, aplicando sequencia de Fibonacci
 */
public class CodificadorArquivo {

    private File file;

    public CodificadorArquivo() {
    }

    public CodificadorArquivo(File file) {
        this.file = file;
    }

    /**
     * @return the file
     */
    public File getFile() {
        return file;
    }

    /**
     * @param file the file to set
     */
    public void setFile(File file) {
        this.file = file;
    }
/**
 * CodificaArquivo.
 * Recebe um arquivo de texto, na codificação UTF-8 e cria um novo arquivo
 * codificado com a sequencia de Fibonacci
 * @return
 * Um File, com o mesmo nome e path do original, porém com extensão ".fib"
 * @throws FileNotFoundException
 * @throws IOException 
 */
    public File CodificaArquivo() throws FileNotFoundException, IOException {
// Prepara arquivo para leitura
        FileReader f1 = new FileReader(file);
        Reader buffer = new BufferedReader(f1);
// Cria arquivo de saída
        String nome = file.getPath();
        File arquivoCodificado = new File( nome + ".fib");
        arquivoCodificado.createNewFile();
        FileWriter escreveArquivo = new FileWriter(arquivoCodificado);
// Codifica o arquivo de leitura, gravando no File de saida
        ProcessaArquivo(buffer, escreveArquivo);
        return arquivoCodificado;
    }
/**
 * ProcessaArquivo.
 * Lê o arquivo passado por buffer e escreve os caracteres codificados no
 * arquivo de saída. Precisa testar se tem um char pronto para gravar a cada
 * iteração, pois a palavra codificada pode ser maior que o normal.
 * @param arquivo
 * @param saida
 * @throws IOException 
 */
    private void ProcessaArquivo(Reader arquivo, Writer saida) throws IOException {
        CodificadorFibonacci c1 = new CodificadorFibonacci();
        int i1;
        int escreve;
// Lê sequencialmente o arquivo
        while ((i1 = arquivo.read()) != -1) {
            c1.setCaracter((char) i1);
            c1.MontaBitSet();
            if (c1.bitSetToInt()) {
                escreve = (int)c1.getIntBitSet();
                saida.write(escreve);
            }
        }
        saida.write((int)c1.getInt());
        saida.close();
    }
}
